package com.wash.shoes.domain.dy.model;

import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * @author lijianguo
 * @Date 27/03/2025 08:17
 * 抖音退款
 **/
@Data
public class DyRefundOrder2 implements Serializable {

    // 是 开发者侧订单号，长度 <= 64 byte
    String out_order_no;

    // 是 开发者侧退款单号，长度 <= 64 byte
    String out_refund_no;

    // 是 开发者自定义透传字段，不支持二进制，长度 <= 2048 byte
    String cp_extra;

    // 是 退款单的跳转的 schema
    OrderEntrySchema order_entry_schema;

    // 否 退款结果通知地址，必须是 HTTPS 类型，若不填，默认使用在抖音开放平台-小程序应用详情-能力-支付页面设置的支付回调地址。
    String notify_url;

    // 否 需要发起退款的商品单信息，数组长度<100 /注意：交易系统订单必传
    List<ItemOrderDetail2> item_order_detail;

    // 否 fee，目前只有航司特定appid非入库业务支持
    List<FeeDetail> fee_detail;

    // 否 退款总金额，单位分 担保交易订单必传 交易系统订单不能传该字段
    Integer refund_total_amount;
    //融合预约订单协同退时必传
    @JSONField(name = "refund_related_order_detail")
    List<RefundRelatedOrderDetail> refund_related_order_detail;


    @Data
    public static class OrderEntrySchema {

        // 是 订单详情页路径，没有前导的/，该字段不能为空，长度 <= 512byte
        String path;

        // 否 路径参数，自定义的 json 结构，序列化成字符串存入该字段，平台不限制，
        // 但是写入的内容需要能够保证生成访问订单详情的 schema
        // 能正确跳转到小程序内部的订单详情页，长度 <= 512byte
        String params;
    }

    // 需要发起退款的商品单信息，数组长度<100 注意：交易系统订单必传  deduct_fee_amount+refund_amount=订单金额
    @Data
    public static class ItemOrderDetail {

        // 是 商品单号，参见通用参数-重要 ID 字段说明
        String item_order_id;

        //该 item_order 需要退款的金额，单位分，不能大于该 item_order 实付金额且要大于 0
        //需要指定 item_order 的退款金额，需要申请开通指定金额退款权限才能使用
        Integer refund_amount;
        //融合预约订单单协同退时必传，固定值2
        private Integer refund_related_item_type = 2;
        //手续费(仅融合预约订单支持使用)
        private Integer deduct_fee_amount = 0;
    }

    @Data
    public static class ItemOrderDetail2 {

        // 是 商品单号，参见通用参数-重要 ID 字段说明
        String item_order_id;

        //该 item_order 需要退款的金额，单位分，不能大于该 item_order 实付金额且要大于 0
        //需要指定 item_order 的退款金额，需要申请开通指定金额退款权限才能使用
        Integer refund_amount;
        //手续费(仅融合预约订单支持使用)
        private Integer deduct_fee_amount = 0;
    }

    // fee，目前只有航司特定appid非入库业务支持
    @Data
    public static class FeeDetail {
        // 是
        // 基建费 FeeType_Infrastructure FeeType = 18
        // 燃油费 FeeType_Fuel FeeType = 19
        // 税费   FeeType_Tax FeeType = 20
        int fee_type;

        //是 fee 退款金额，需要一次全退
        Integer refund_amount;
    }

    /**
     * 协同退请求参数
     * <p>
     * order_id
     * string
     * 否
     * 预约单号/加价单号  融合预约订单协同退时必传
     * 800
     * refund_amount
     * int64
     * 否
     * 退款金额(仅融合预约订单支持使用)
     * 20
     * deduct_fee_amount
     * int64
     * 否
     * 手续费(仅融合预约订单支持使用)
     * 20
     * <p>
     * <p>
     * <p>
     * deduct_fee_amount+refund_amount=订单金额
     */
    @Data
    public static class RefundRelatedOrderDetail {
        //预约单号/加价单号  融合预约订单协同退时必传
        private String order_id;
        //退款金额(仅融合预约订单支持使用)
        private Integer refund_amount;
        //手续费(仅融合预约订单支持使用)
        private int deduct_fee_amount;
    }
}
